const oss = require('ali-oss');
const path = require('path');
function OssUtils(option) {
  this.ossParam = {
    ...option
  }
  this.headers = {
    // 指定Object的存储类型。
    'x-oss-storage-class': 'Standard',
    // 指定Object标签，可同时设置多个标签。
    'x-oss-tagging': 'Tag1=1&Tag2=2',
    // 指定初始化分片上传时是否覆盖同名Object。此处设置为true，表示禁止覆盖同名Object。
    'x-oss-forbid-overwrite': 'false'
  }
  this.client = oss({
    ...this.ossParam
  });
}
OssUtils.prototype.singleUpload = async function (uploadPath, option) {
  // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
  // 如果本地文件的完整路径中未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。 
  this.client.put(uploadPath, path.normalize(option.data.url), { headers: this.headers }).then((result) => {
    if (option.success) {
      option.success(result)
    } 
  }).catch(e => {
    if (option.fail) {
      option.fail(e)
    }
  })
}
OssUtils.prototype.multipartUpload = async function (uploadPath, option) {
  try {
    const progress = (p, _checkpoint) => {
      // Object的上传进度。
      console.log(p);
    }; 
    delete this.headers['x-oss-storage-class']
    const result = await this.client.multipartUpload(uploadPath, path.normalize( option.data.url), {
      progress,
      headers: this.headers,
      // 指定meta参数，自定义Object的元信息。通过head接口可以获取到Object的meta数据。 
    })  
    if (option.success) {
      option.success(result)
    }  
  } catch (e) {  
    if (option.fail) {
      option.fail(e.message)
    }
  }
}
OssUtils.prototype.setHeader = function (param) {
  this.header = { ...param }
}

module.exports = OssUtils;
